package com.been.common.util;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

/**
 * Java 类对象操作工具类。
 * 比如对象的转换等。扩展类应用等。
 * 
 * @author been 2011-09-27
 */
public class BeanUtil {

	/**
	 * @param <T>
	 *            目标类型
	 * @param clazz
	 *            目标类型的class对象
	 * @param objList
	 *            需要转换的对象
	 * @return 返回指定的对象
	 * @throws IllegalArgumentException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws IntrospectionException
	 * @throws InvocationTargetException
	 */
	public static <T> List<T> reverse(Class<T> clazz, List<?> objList)
			throws IllegalArgumentException, InstantiationException,
			IllegalAccessException, IntrospectionException,
			InvocationTargetException {
		List<T> recls = new ArrayList<T>();
		for (Object obj : objList) {
			recls.add(reverse(clazz, obj));
		}
		return recls;
	}

	/**
	 * 将一个对象转换为指定类型
	 * 
	 * @param <T>
	 *            目标类型
	 * @param clazz
	 *            目标类型的class对象
	 * @param obj
	 *            需要转换的对象
	 * @return 返回指定的对象
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws IntrospectionException
	 * @throws IllegalArgumentException
	 * @throws InvocationTargetException
	 */
	public static <T> T reverse(Class<T> clazz, Object obj)
			throws InstantiationException, IllegalAccessException,
			IntrospectionException, IllegalArgumentException,
			InvocationTargetException {
		//得到Class所对应的对象
		T recl = clazz.newInstance();
		//得到定义的所有属性
		Field[] fields = obj.getClass().getDeclaredFields();
		//循环设置
		for (Field field : fields) {
			//导出一个clazz类的属性
			PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
					field.getName(), clazz);
			//得到和设置属性值
			propertyDescriptor.getWriteMethod().invoke(recl,
					propertyDescriptor.getReadMethod().invoke(obj));
		}
		return recl;
	}
	
	
}
